package com.grupobbva.iici.service.impl;

import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import com.grupobbva.iici.dao.CommonDAO;
import com.grupobbva.iici.serializable.BaseDomain;
import com.grupobbva.iici.service.BaseService;
import com.grupobbva.iici.util.FiltroDTO;

public abstract class BaseServiceImpl implements BaseService {

	private static Logger log = Logger.getLogger(BaseServiceImpl.class);
	
	CommonDAO commonDAO;
	
	@Autowired
	public void init(CommonDAO commonDAO) {
		this.commonDAO=commonDAO;
	}
	

	protected void escribirParametros(String metodo, Object... parametros) {
		try {
			if (parametros == null) {
				log.info(metodo + " SIN PARAMETROS");
				return;
			}
			for (int i = 0; i < parametros.length; i++) {
				log.info(metodo + " PARAMETRO " + (i + 1) + "["
						+ BeanUtils.describe(parametros[i]) + "]");
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}

	public BaseDomain registrar(BaseDomain entidad) {
		escribirParametros("registrar", entidad);
		return commonDAO.registrar(entidad);
	}

	public BaseDomain modificar(BaseDomain entidad) {
		escribirParametros("modificar", entidad);
		return commonDAO.modificar(entidad);
	}

	public BaseDomain eliminar(BaseDomain entidad) {
		escribirParametros("eliminar", entidad);
		return commonDAO.eliminar(entidad);
	}

	@Transactional(readOnly = true)
	public <T> T obtenerEntidadPorCodigo(Class<T> clase, Object codigo) {
		escribirParametros("obtenerEntidadPorCodigo", codigo);
		return commonDAO.obtenerEntidadPorCodigo(clase, codigo);
	}

	@Transactional(readOnly = true)
	public List<BaseDomain> obtenerEntidadesPorFiltros(Class clase,
			FiltroDTO filtroDTO, int... indicadorInicioCantidad) {
		escribirParametros("obtenerEntidadesPorFiltros", filtroDTO);
		return commonDAO.obtenerEntidadesPorFiltros(clase, filtroDTO,
				indicadorInicioCantidad);
	}
	
	

}
